# [HCTF 2018]WarmUp 1
# PHP函数
# 1.mb_substr( )
获取部分字符串
mb_substr ( string $str , int $start , int $length = NULL , string $encoding = mb_internal_encoding() ) : string
根据字符数执行一个多字节安全的 substr() (opens new window) 操作。 位置是从 str
的开始位置进行计数。 第一个字符的位置是 0。第二个字符的位置是 1,以此类推。
# 2.mb_strpos( )
查找字符串在另一个字符串中首次出现的位置
mb_strpos ( string $haystack , string $needle , int $offset = 0 , string $encoding = mb_internal_encoding() ) : int
查找 string 在一个 string 中首次出现的位置。
基于字符数执行一个多字节安全的 strpos() 操作。 第一个字符的位置是 0,第二个字符的位置是 1,以此类推。
# 解题
打开场景,看到一张特别滑稽的滑稽笑脸。先点击F12用开发者工具查看一下源代码。发现了source.php。
打开source.php可以查看到主页的源代码,通过源代码可以判断出,这是一道文件包含问题。
前面是一个类,先给他跳过去一会再看。
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
先看底部的代码,发现这里获取请求的file参数,要求不可以为空,同时满足是字符串,且要满足上面emmm类中的chackfile函数。之后就可以包含(运行)运行刚刚上传的文件。(这里暗示需要上传一个PHP文件)
通过查看上面定义chackFile函数的代码,可以看出来当上传的文件满足这三个条件时,可以返回trun,之后执行 include $_REQUEST['file'];
这句话:
而且通过判断,这个程序会取到 ?
前面的值。
也就是说,提交 hint.php?../../../../../
等也是可以通过的,因为他在判断时候仅判断 ?
前 hint.php
的部分。
打开hint.php,看到提示flag在ffffllllaaaagggg中。
由此可以构建payload:http://xxx/index.php?file=source.php%253f../../../../../ffffllllaaaagggg
得到Flag,题目解出。
# 错误的想法
一开始还有想过将一个写有高亮hint.php的source.php上传上去,但是实践证明,我想错了。
# 知识点
- 文件包含
- Get提交
- 字符串截断
# 参考文章
后期部分参考了@1stPeak 大佬的文章,但还是没找到我想要的答案,就是hint.php?后面那一堆为什么这么构建,求解答~~